using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;

////////////////////////////////////////////////////////////////////////////////////////////////////
// namespace: Dimok
//
// summary:	.
////////////////////////////////////////////////////////////////////////////////////////////////////

namespace Dimok {

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Ordered dictionary ex. </summary>
	///
	/// <remarks>	Dimon, 11/23/2010. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public class OrderedDictionaryEx : OrderedDictionary{

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Default constructor. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public OrderedDictionaryEx() : base() { }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="IgnoreCase">	true to ignore case. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public OrderedDictionaryEx(bool IgnoreCase) : base(IgnoreCase ? StringComparer.InvariantCultureIgnoreCase : null) { }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="nameValue">	A variable-length parameters list containing name value. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public OrderedDictionaryEx(params object[] nameValue) : this(false,nameValue) { }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="IgnoreCase">	true to ignore case. </param>
		/// <param name="nameValue">	A variable-length parameters list containing name value. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public OrderedDictionaryEx(bool IgnoreCase,params object[] nameValue): this(IgnoreCase) {
			for( int i = 0; i < nameValue.Length; i += 2 )
				this.Add(nameValue[i],nameValue[i+1]);
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the key list. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <returns>	. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public string KeyList() { return KeyList(",", "", ""); }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the key list. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="dbStyle">	true to database style. </param>
		///
		/// <returns>	. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public string KeyList(bool dbStyle) { return KeyList(this,dbStyle); }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the key list. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="middle">	The middle. </param>
		///
		/// <returns>	. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public string KeyList(string middle) { return KeyList(middle, "", ""); }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the key list. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="middle">	The middle. </param>
		/// <param name="left">		The left. </param>
		/// <param name="right">	The right. </param>
		///
		/// <returns>	. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public string KeyList(string middle, string left, string right) { return KeyList(this, middle, left, right); }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the key list. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="dic">			The dic. </param>
		/// <param name="dbStyle">	true to database style. </param>
		///
		/// <returns>	. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public static string KeyList(IDictionary dic, bool dbStyle) {
			return KeyList(dic, ",", dbStyle ? "[" : "", dbStyle ? "]" : ""); 
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the key list. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="dic">		The dic. </param>
		/// <param name="middle">	The middle. </param>
		/// <param name="left">		The left. </param>
		/// <param name="right">	The right. </param>
		///
		/// <returns>	. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public static string KeyList(IDictionary dic, string middle,string left,string right) {
			List<string> al = new List<string>();
			foreach (DictionaryEntry de in dic)
				al.Add(de.Key+"");
			return left + string.Join(middle, al.ToArray()) + right;
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	string casting operator. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="od">	The od. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public static implicit operator string(OrderedDictionaryEx od) {
			if( od == null )return "";
			List<string> al = new List<string>();
			foreach( DictionaryEntry de in od )
				al.Add(de.Key+":"+de.Value);
			return string.Join("\n\t", al.ToArray());
		}
	}
}
